package com.llmcu.trial.completablefuture;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * 不执行get方法，这个异步任务也已经执行跑起来了
 */
@Slf4j
public class CompletableFutureExample {
    public static void main(String[] args) throws InterruptedException {
        log.info("program started===============");
        // Step 1: 异步执行任务，获取数据

        CompletableFuture<String> fetchDataFuture = CompletableFuture.supplyAsync(() -> {
            // 模拟耗时操作，比如从远程服务器获取数据
            try {
                Thread.sleep(2000); // 模拟2秒的延迟
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Fetched Data";
        });

        // Step 2: 处理获取到的数据
        CompletableFuture<String> processDataFuture = fetchDataFuture.thenApply(data -> {
            // 处理获取到的数据
            return "Processed " + data;
        });

        // Step 3: 使用数据
        processDataFuture.thenAccept(result -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            // 输出处理后的结果
            log.info(result);
        });

        processDataFuture.thenRun(()->{
            log.info("thenRun");
        });

        TimeUnit.SECONDS.sleep(4);

        log.info("start getting==========");

        // 等待所有异步任务完成
        try {
            processDataFuture.get();  // .get() 也可以用来等待异步任务完成
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        log.info("finish getting==========");
    }

}
